home *** CD-ROM | disk | FTP | other *** search
/ Hobby PC 13 / Hobby PC 13.iso / assets / Asset Library / Dynomat Menus / hierMenus.js < prev    next >
Text File  |  2001-04-09  |  23KB  |  841 lines

  1. /*hierMenus.js - Cross-Browser/Full-Window/Frames
  2. * by Peter Belesis. v3.08 990824
  3. * Copyright (c) 1999 internet.com Corp. All Rights Reserved.
  4. * Originally published and documented at http://www.dhtmlab.com/
  5. * You may use this code on a public Web site only if this entire
  6. * copyright notice appears unchanged and you publicly display
  7. * on the Web page a link to http://www.dhtmlab.com/.
  8. *
  9. * Contact pbel@internet.com for all other uses.
  10. */
  11.  
  12. /***********
  13. includes fixes for:
  14. - zindex for IE4
  15. - menu widths
  16. - child positioning
  17. - image and text positioning/wrapping
  18. ***********/
  19.  
  20. loader = (isFrames) ? (NS4) ? parent : parent.document.body : window;
  21. loader.onload = startIt;
  22. if(NS4){
  23.     origWidth = loader.innerWidth;
  24.     origHeight = loader.innerHeight;
  25.     loader.onresize = reDo;
  26. }
  27. isLoaded = false;
  28. NSresized = false;
  29.  
  30. if (!window.menuVersion) {
  31.     clickKill = showVisited = NSfontOver = keepHilite = clickStart = false;
  32. }
  33.  
  34. // 3.08 added next line
  35. if (!window.imgHspace) imgHspace=0;
  36.  
  37. isWin = (navigator.appVersion.indexOf("Win") != -1)
  38. if (!isWin && !isMac) NSfontOver = showVisited = false;
  39.  
  40. mSecsVis = secondsVisible*1000;
  41. isRight = (window.navFrLoc && navFrLoc == "right");
  42.  
  43. //3.08 modified next line with added space
  44. imgSuf = (isRight) ? ">"  : " ALIGN=RIGHT>";
  45.  
  46. //3.08 modified next line for use of imgHspace variable
  47. imgStr = "<IMG SRC='" + imgSrc + "' WIDTH=" + imgSiz + " HEIGHT=" + imgSiz +" VSPACE=2 HSPACE="+ imgHspace +" BORDER=0"+ imgSuf;
  48.  
  49. // 3.08 added next line
  50. fullImgSize = (imgSiz+(imgHspace*2));
  51.  
  52. //3.08 added next line: wrap item text by using span with image
  53. if(IE4) imgStr = "<SPAN STYLE='height:100%;width:"+ (fullImgSize-(isRight?3:0)) +";float:"+ (isRight?"left":"right") +";overflow:hidden'>"+ imgStr +"</SPAN>";
  54.  
  55. //3.08 omitted next line:
  56. //spStr = (isRight && NS4) ? "<SPACER TYPE=HORIZONTAL SIZE="+imgSiz+">" : "";
  57.  
  58. areCreated = false;
  59. menuLoc = null;
  60.  
  61. function initVars() {
  62.     if(areCreated) {
  63.         for(i=1; i<topCount; i++) {
  64.             cur = eval("elMenu"+i);
  65.             clearTimeout(cur.hideTimer);
  66.             cur.hideTimer=null;
  67.         }
  68.         clearTimeout(allTimer);
  69.     }
  70.     topCount = 1;
  71.     areCreated = false;
  72.     beingCreated = false;
  73.     isOverMenu = false;
  74.     currentMenu = null;
  75.     allTimer = null;
  76. }
  77.  
  78. initVars();
  79.  
  80. function NSunloaded(){
  81.     isLoaded = false;
  82. }
  83.  
  84. function NSloaded(e){
  85.     if (e.target.name == mainFrName) {
  86.         initVars();
  87.         startIt();
  88.     }
  89. }
  90.  
  91. function IEunloaded() {
  92.     initVars();
  93.     isLoaded = false;
  94.     setTimeout("keepTrack()",50)
  95. }
  96.  
  97. function keepTrack() {
  98.     if (menuLoc.document.readyState == "complete") {
  99.         initVars();
  100.         startIt();
  101.     }
  102.     else {
  103.         setTimeout("keepTrack()",50);
  104.     }
  105. }
  106.  
  107. function startIt() {
  108.     isLoaded = true;
  109.     if (isFrames) {
  110.         menuLoc = eval("parent.frames." + mainFrName);
  111.         if (NS4) {
  112.             loader.captureEvents(Event.LOAD);
  113.             loader.onload = NSloaded;
  114.             menuLoc.onunload = NSunloaded;
  115.         }
  116.         if (IE4) {
  117.             menuLoc.document.body.onunload = IEunloaded;
  118.  
  119.         }
  120.     }
  121.     else {
  122.         menuLoc = window;
  123.     }
  124.     menuLoc.nav = nav = window;
  125.     if (clickKill) {
  126.         if (NS4) menuLoc.document.captureEvents(Event.MOUSEDOWN);
  127.         menuLoc.document.onmousedown = clicked;
  128.     }
  129.     makeTop();    
  130. }
  131.  
  132. function makeTop(){
  133.     beingCreated = true;
  134.  
  135. // 3.08 added if statement
  136.     if(IE4) {
  137.         topZ = 0;
  138.         for (z=0;z<menuLoc.document.all.length;z++){
  139.             oldEl = menuLoc.document.all(z);
  140.             topZ = Math.max(oldEl.style.zIndex,topZ)
  141.         }
  142.     }
  143.     while(eval("window.arMenu" + topCount)) {
  144.         (NS4) ? makeMenuNS(false,topCount) : makeMenuIE(false,topCount);
  145.         topCount++
  146.     }
  147.  
  148.     status = (topCount-1) + " Hierarchical Menu Trees Created"
  149.     areCreated = true;
  150.     beingCreated = false;
  151. }
  152.  
  153. function makeMenuNS(isChild,menuCount,parMenu,parItem) {
  154.     tempArray = eval("arMenu" + menuCount);
  155.     
  156.     if (!isChild) {
  157.         tempWidth = tempArray[0] ? tempArray[0] : menuWidth;
  158.         menu = makeElement("elMenu" + menuCount,tempWidth,null,null);
  159.     }
  160.     else {
  161.         menu = makeElement("elMenu" + menuCount,null,parMenu,null);
  162.     }
  163.     menu.array = tempArray;
  164.     menu.setMenuTree = setMenuTree;
  165.     menu.setMenuTree(isChild,parMenu);
  166.  
  167.     while (menu.itemCount < menu.maxItems) {
  168.         menu.itemCount++;
  169.         status = "Creating Hierarchical Menus: " + menuCount + " / " + menu.itemCount;
  170.         prevItem = (menu.itemCount > 1) ? menu.item : null;
  171.         itemName = "item" + menuCount + "_" + menu.itemCount;
  172.  
  173.         menu.item = makeElement(itemName,null,null,menu);
  174.  
  175.         menu.item.prevItem = prevItem;
  176.         menu.item.setup = itemSetup;
  177.         menu.item.setup(menu.itemCount,menu.array);
  178.         if (menu.item.hasMore) {
  179.             makeMenuNS(true,menuCount + "_" + menu.itemCount,menu,menu.item);
  180.             menu = menu.parentMenu;
  181.         }
  182.     }
  183.  
  184.     menu.lastItem = menu.item;
  185.     menu.setup(isChild,parMenu,parItem);
  186. }
  187.  
  188. //3.08 added function: determine if menu is in menu tree
  189. function findTree(men){
  190.     foundTree = false;
  191.     for(i=11;i<men.array.length;i+=3){
  192.         if(men.array[i]) {
  193.             foundTree = true;
  194.             break;
  195.         }
  196.     }
  197.  
  198.     return foundTree;
  199. }
  200.  
  201. function setMenuTree(isChild,parMenu) {
  202.     if (!isChild) {
  203.         this.menuWidth = this.array[0] ? this.array[0] : menuWidth;
  204.         this.menuLeft = this.array[1];
  205.         this.menuTop = this.array[2];
  206.         this.menuFontColor = this.array[3] ? this.array[3] : fntCol;
  207.         this.menuFontOver = this.array[4] ? this.array[4] : overFnt;
  208.         this.menuBGColor = this.array[5] ? this.array[5] : backCol;
  209.         this.menuBGOver = this.array[6] ? this.array[6] : overCol;
  210.         this.menuBorCol = this.array[7] ? this.array[7] : borCol;
  211.         this.menuSeparatorCol = this.array[8] ? this.array[8] : separatorCol;
  212.         this.treeParent = this;
  213.         this.startChild = this;
  214.  
  215. // 3.08 is menu in menu tree?
  216.         this.isTree = findTree(this);
  217.     }
  218.     else {
  219.         this.menuWidth = parMenu.menuWidth;
  220.         this.menuLeft = parMenu.menuLeft;
  221.         this.menuTop = parMenu.menuTop;
  222.         this.menuFontColor = parMenu.menuFontColor;
  223.         this.menuFontOver = parMenu.menuFontOver;
  224.         this.menuBGColor = parMenu.menuBGColor;
  225.         this.menuBGOver = parMenu.menuBGOver;
  226.         this.menuBorCol = parMenu.menuBorCol;
  227.         this.menuSeparatorCol = parMenu.menuSeparatorCol;
  228.         this.treeParent = parMenu.treeParent;
  229.  
  230. // 3.08 keep parent property value
  231.         this.isTree = parMenu.isTree;
  232.     }
  233.  
  234.     this.maxItems = (isChild) ? this.array.length/3 : (this.array.length-9)/3;
  235.     this.hasParent = isChild;
  236.     this.setup = menuSetup;
  237.     this.itemCount = 0;
  238. }
  239.  
  240. function makeMenuIE(isChild,menuCount,parMenu) {
  241.  
  242.     menu = makeElement("elMenu" + menuCount);
  243.     menu.array = eval("arMenu" + menuCount);
  244.  
  245.     menu.setMenuTree = setMenuTree;
  246.     menu.setMenuTree(isChild,parMenu);
  247.  
  248.     menu.itemStr = "";
  249.     
  250.     while (menu.itemCount < menu.maxItems) {
  251.         menu.itemCount++;
  252.         status = "Creating Hierarchical Menus: " + menuCount + " / " + menu.itemCount;
  253.         itemName = "item" + menuCount + "_" + menu.itemCount;
  254.  
  255.         arrayPointer = (isChild) ? (menu.itemCount-1)*3 :((menu.itemCount-1)*3)+9;
  256.         dispText = menu.array[arrayPointer];
  257.         hasMore = menu.array[arrayPointer + 2];
  258.         htmStr = (hasMore) ? imgStr + dispText : dispText;
  259.  
  260. //3.08 modified next line: subtract borderwidth from menuwidth for item width
  261.         menu.itemStr += "<SPAN ID=" + itemName + " STYLE=\"width:" + (menu.menuWidth-(borWid*2)) + "\">" + htmStr + "</SPAN><BR>";
  262.  
  263.         if (hasMore) {
  264.             makeMenuIE(true,menuCount + "_" + menu.itemCount,menu);
  265.             menu = menu.parentMenu;
  266.         }    
  267.     }
  268.  
  269.     menu.innerHTML = menu.itemStr;
  270.     itemColl = menu.children.tags("SPAN");
  271.     for (i=0; i<itemColl.length; i++) {
  272.         it = itemColl(i);
  273.         it.setup = itemSetup;
  274.         it.setup(i+1,menu.array);
  275.     }
  276.     menu.lastItem = itemColl(itemColl.length-1);
  277.     menu.setup(isChild,parMenu);
  278. }
  279.  
  280. function makeElement(whichEl,whichWidth,whichParent,whichContainer) {
  281.     if (NS4) {
  282.         if (whichWidth) {
  283.             elWidth = whichWidth;
  284.         }
  285.         else {
  286.             elWidth = (whichContainer) ? whichContainer.menuWidth : whichParent.menuWidth;
  287.             if (whichContainer) elWidth = elWidth-(borWid*2)-(itemPad*2);
  288.         }
  289.         if (!whichContainer) whichContainer = menuLoc;
  290.         eval(whichEl + "= new Layer(elWidth,whichContainer)");
  291.     }
  292.     else {
  293.         elStr = "<DIV ID=" + whichEl + " STYLE='position:absolute'></DIV>";
  294.         menuLoc.document.body.insertAdjacentHTML("BeforeEnd",elStr);
  295.         if (isFrames) eval(whichEl + "= menuLoc." + whichEl);
  296.     }
  297.     return eval(whichEl);
  298. }
  299.  
  300. function itemSetup(whichItem,whichArray) {
  301.     this.onmouseover = itemOver;
  302.     this.onmouseout = itemOut;
  303.     this.container = (NS4) ? this.parentLayer : this.offsetParent;
  304.  
  305.     arrayPointer = (this.container.hasParent) ? (whichItem-1)*3 : ((whichItem-1)*3)+9;
  306.  
  307.     this.dispText = whichArray[arrayPointer];
  308.     this.linkText = whichArray[arrayPointer + 1];
  309.     this.hasMore = whichArray[arrayPointer + 2];
  310.  
  311.     if (IE4 && this.hasMore) {
  312.         this.child = eval("elMenu" + this.id.substr(4));
  313.         this.child.parentMenu = this.container;
  314.         this.child.parentItem = this;
  315.     }
  316.  
  317.     if (this.linkText) {
  318.         if (NS4) {
  319.             this.captureEvents(Event.MOUSEUP)
  320.             this.onmouseup = linkIt;
  321.         }
  322.         else {
  323.             this.onclick = linkIt;
  324.             this.style.cursor = "hand";
  325.         }
  326.     }
  327.  
  328.     if (NS4) {
  329.         htmStr = this.dispText;
  330.         if (fntBold) htmStr = htmStr.bold();
  331.         if (fntItal) htmStr = htmStr.italics();
  332.  
  333.         htmStr = "<FONT FACE='" + fntFam + "' POINT-SIZE=" + fntSiz + ">" + htmStr+ "</FONT>";
  334.  
  335. //3.08 modified next two lines since we don't need to rewrite image everytime.
  336.         this.htmStrOver = htmStr.fontcolor(this.container.menuFontOver);
  337.         this.htmStr = htmStr.fontcolor(this.container.menuFontColor);
  338.  
  339. //3.08 ...and omitted next two lines
  340.         //this.htmStr = (this.hasMore) ? imgStr + htmStr : spStr + htmStr;
  341.         //this.htmStrOver = (this.hasMore) ? imgStr + htmStrOver : spStr + htmStrOver;    
  342.  
  343. //3.08 added if statement: write the image once only        
  344.         if(this.hasMore) {
  345.             this.document.write(imgStr);
  346.             this.document.close();
  347.         }
  348.  
  349.         this.visibility = "inherit";
  350.         this.bgColor = this.container.menuBGColor;
  351.  
  352.         if (whichItem == 1) {
  353.             this.top = borWid + itemPad;
  354.         }
  355.         else {
  356.             this.top = this.prevItem.top + this.prevItem.clip.height + separator;
  357.         }
  358.         this.left = borWid + itemPad;
  359.         this.clip.top = this.clip.left = -itemPad;
  360.         this.clip.right = this.container.menuWidth-(borWid*2)-itemPad;
  361.  
  362. //3.08 added next 2 lines: maxTxtWidth and fullImgSize variables to help determine the width of txtLyr:
  363.         maxTxtWidth = this.container.menuWidth-(borWid*2)-(itemPad*2);
  364.         if (this.container.isTree) maxTxtWidth-=(fullImgSize); 
  365.  
  366.         this.txtLyr = new Layer(maxTxtWidth,this);
  367.  
  368. //3.08 added next line:
  369.         if (isRight && this.container.isTree) this.txtLyr.left = fullImgSize;
  370.  
  371.         this.txtLyr.document.write(this.htmStr);
  372.         this.txtLyr.document.close();
  373.         this.txtLyr.visibility = "inherit";
  374.  
  375. //3.08 modified next line: changed "+=" to "="
  376.         this.clip.bottom = this.txtLyr.document.height+itemPad;
  377.  
  378.         this.dummyLyr = new Layer(100,this);
  379.         this.dummyLyr.left = this.dummyLyr.top = -itemPad;
  380.         this.dummyLyr.clip.width = this.clip.width;
  381.         this.dummyLyr.clip.height = this.clip.height;
  382.         this.dummyLyr.visibility = "inherit";
  383.     }
  384.     else {
  385.         with (this.style) {
  386.             padding = itemPad;
  387.  
  388. //3.08 added if statement
  389.             if (this.container.isTree && !this.hasMore) {
  390.                 if (isRight) paddingLeft = itemPad+fullImgSize;
  391.                 else paddingRight = itemPad+fullImgSize;
  392.             }
  393.             color = this.container.menuFontColor;
  394.             fontSize = fntSiz + "pt";
  395.             fontWeight = (fntBold) ? "bold" : "normal";
  396.             fontStyle =    (fntItal) ? "italic" : "normal";
  397.             fontFamily = fntFam;
  398.         
  399.             borderBottomWidth = separator + "px";
  400.             borderBottomColor = this.container.menuSeparatorCol;
  401.             borderBottomStyle = "solid";
  402.             backgroundColor = this.container.menuBGColor;
  403.         }
  404.     }
  405. }    
  406.  
  407. function menuSetup(hasParent,openCont,openItem) {
  408.     this.onmouseover = menuOver;
  409.     this.onmouseout = menuOut;
  410.     
  411.     this.showIt = showIt;
  412.     this.keepInWindow = keepInWindow;
  413.     this.hideTree = hideTree
  414.     this.hideParents = hideParents;
  415.     this.hideChildren = hideChildren;
  416.     this.hideTop = hideTop;
  417.     this.hasChildVisible = false;
  418.     this.isOn = false;
  419.     this.hideTimer = null;
  420.  
  421.     this.childOverlap = (perCentOver != null) ? ((perCentOver/100) * this.menuWidth) : childOverlap;
  422.     this.currentItem = null;
  423.     this.hideSelf = hideSelf;
  424.         
  425.     if (hasParent) {
  426.         this.hasParent = true;
  427.         this.parentMenu = openCont;
  428.         if (NS4) {
  429.             this.parentItem = openItem;
  430.             this.parentItem.child = this;
  431.         }
  432.     }
  433.     else {
  434.         this.hasParent = false;
  435.     }
  436.  
  437.     if (NS4) {
  438.         this.bgColor = this.menuBorCol;
  439.         this.fullHeight = this.lastItem.top + this.lastItem.clip.bottom + borWid;
  440.         this.clip.right = this.menuWidth;
  441.         this.clip.bottom = this.fullHeight;
  442.     }
  443.     else {
  444.         with (this.style) {
  445.             width = this.menuWidth;
  446.             borderWidth = borWid;
  447.             borderColor = this.menuBorCol;
  448.             borderStyle = borSty;
  449.  
  450. //3.08 added next line
  451.             zIndex = topZ;
  452.         }
  453.  
  454.         this.lastItem.style.border="";
  455.         this.fullHeight = this.scrollHeight;
  456.         this.showIt(false);
  457.         this.onselectstart = cancelSelect;
  458.         this.moveTo = moveTo;
  459.         this.moveTo(0,0);
  460.     }
  461. }
  462.  
  463. function popUp(menuName,e){
  464.     if (NS4 && NSresized) startIt();
  465.     if (!isLoaded) return;
  466.     linkEl = (NS4) ? e.target : event.srcElement;
  467.     if (clickStart) linkEl.onclick = popMenu;
  468.     if (!beingCreated && !areCreated) startIt();
  469.     linkEl.menuName = menuName;    
  470.     if (!clickStart) popMenu(e);
  471. }
  472.  
  473. function popMenu(e){
  474.     if (!isLoaded || !areCreated) return true;
  475.  
  476.     eType = (NS4) ? e.type : event.type;
  477.     if (clickStart && eType != "click") return true;
  478.     hideAll();
  479.  
  480.     linkEl = (NS4) ? e.target : event.srcElement;
  481.     
  482.     currentMenu = eval(linkEl.menuName);
  483.     currentMenu.hasParent = false;
  484.     currentMenu.treeParent.startChild = currentMenu;
  485.     
  486.     if (IE4) menuLocBod = menuLoc.document.body;
  487.     if (!isFrames) {
  488.         xPos = (currentMenu.menuLeft) ? currentMenu.menuLeft : (NS4) ? e.pageX : (event.clientX + menuLocBod.scrollLeft);
  489.         yPos = (currentMenu.menuTop) ? currentMenu.menuTop : (NS4) ? e.pageY : (event.clientY + menuLocBod.scrollTop);
  490.     }
  491.     else {
  492.         switch (navFrLoc) {
  493.             case "left":
  494.                 xPos = (currentMenu.menuLeft) ? currentMenu.menuLeft : (NS4) ? menuLoc.pageXOffset : menuLocBod.scrollLeft;
  495.                 yPos = (currentMenu.menuTop) ? currentMenu.menuTop : (NS4) ? (e.pageY-pageYOffset)+menuLoc.pageYOffset : event.clientY + menuLocBod.scrollTop;
  496.                 break;
  497.             case "top":
  498.                 xPos = (currentMenu.menuLeft) ? currentMenu.menuLeft : (NS4) ? (e.pageX-pageXOffset)+menuLoc.pageXOffset : event.clientX + menuLocBod.scrollLeft;
  499.                 yPos = (currentMenu.menuTop) ? currentMenu.menuTop : (NS4) ? menuLoc.pageYOffset : menuLocBod.scrollTop;
  500.                 break;
  501.             case "bottom":
  502.                 xPos = (currentMenu.menuLeft) ? currentMenu.menuLeft : (NS4) ? (e.pageX-pageXOffset)+menuLoc.pageXOffset : event.clientX + menuLocBod.scrollLeft;
  503.                 yPos = (currentMenu.menuTop) ? currentMenu.menuTop : (NS4) ? menuLoc.pageYOffset+menuLoc.innerHeight : menuLocBod.scrollTop + menuLocBod.clientHeight;
  504.                 break;
  505.             case "right":
  506.                 xPos = (currentMenu.menuLeft) ? currentMenu.menuLeft : (NS4) ? menuLoc.pageXOffset+menuLoc.innerWidth : menuLocBod.scrollLeft+menuLocBod.clientWidth;
  507.                 yPos = (currentMenu.menuTop) ? currentMenu.menuTop : (NS4) ? (e.pageY-pageYOffset)+menuLoc.pageYOffset : event.clientY + menuLocBod.scrollTop;
  508.                 break;
  509.         }
  510.     }
  511.  
  512.     currentMenu.moveTo(xPos,yPos);
  513.     currentMenu.keepInWindow()
  514.     currentMenu.isOn = true;
  515.     currentMenu.showIt(true);
  516.  
  517.     return false;
  518. }
  519.  
  520. function menuOver(e) {
  521.     this.isOn = true;
  522.     isOverMenu = true;
  523.     currentMenu = this;
  524.     if (this.hideTimer) clearTimeout(this.hideTimer);
  525. }
  526.  
  527. function menuOut() {
  528.     if (IE4) {
  529.         theEvent = menuLoc.event;
  530.         if (theEvent.srcElement.contains(theEvent.toElement)) return;
  531.     }
  532.     this.isOn = false;
  533.     isOverMenu = false;
  534.  
  535.     menuLoc.status = "";
  536.     if (!clickKill) allTimer = setTimeout("currentMenu.hideTree()",10);  
  537. }
  538.  
  539. function itemOver(){
  540.     if (keepHilite) {
  541.         if (this.container.currentItem && this.container.currentItem != this) {
  542.             if (NS4) {
  543.                 this.container.currentItem.bgColor = this.container.menuBGColor;
  544.                 if (NSfontOver) {
  545.                     with (this.container.currentItem.txtLyr.document) {
  546.                         write(this.container.currentItem.htmStr)
  547.                         close();
  548.                     }
  549.                 }
  550.             }
  551.             else {
  552.                 with (this.container.currentItem.style) {
  553.                     backgroundColor = this.container.menuBGColor;
  554.                     color = this.container.menuFontColor;
  555.                 }
  556.             }
  557.         }
  558.     }
  559.  
  560.     if (IE4) {
  561.         theEvent = menuLoc.event;
  562.         if (theEvent.srcElement.tagName == "IMG") return;
  563.         this.style.backgroundColor = this.container.menuBGOver;
  564.         this.style.color = this.container.menuFontOver;
  565.     }
  566.     else {
  567.         this.bgColor = this.container.menuBGOver;
  568.         if (NSfontOver) {
  569.             this.txtLyr.document.write(this.htmStrOver);
  570.             this.txtLyr.document.close();
  571.         }
  572.     }
  573.  
  574.     menuLoc.status = this.linkText;
  575.  
  576.     this.container.currentItem = this;
  577.  
  578.     if (this.container.hasChildVisible) {
  579.         this.container.hideChildren(this);
  580.     }
  581.  
  582.     if (this.hasMore) {
  583.         horOffset = (isRight) ? (this.container.childOverlap - this.container.menuWidth) : (this.container.menuWidth - this.container.childOverlap);
  584.  
  585.         if (NS4) {
  586.             this.childX = this.container.left + horOffset;
  587.  
  588. //3.08 modified next line
  589.             this.childY = (this.pageY+this.clip.top) + childOffset;
  590.         }
  591.         else {
  592.             this.childX = this.container.style.pixelLeft + horOffset;
  593.  
  594. //3.08 modified next line
  595.             this.childY = this.offsetTop + this.container.style.pixelTop + childOffset + borWid;
  596.         }
  597.  
  598.         this.child.moveTo(this.childX,this.childY);
  599.         this.child.keepInWindow();
  600.         this.container.hasChildVisible = true;
  601.         this.container.visibleChild = this.child;
  602.         this.child.showIt(true);
  603.     }
  604. }
  605.  
  606. function itemOut() {
  607.     if (IE4) {
  608.         theEvent = menuLoc.event;
  609.         if (theEvent.srcElement.contains(theEvent.toElement)
  610.      || (theEvent.fromElement.tagName=="IMG" && theEvent.toElement.contains(theEvent.fromElement)))
  611.         return;
  612.         if (!keepHilite) {
  613.             this.style.backgroundColor = this.container.menuBGColor;
  614.             this.style.color = this.container.menuFontColor;
  615.         }
  616.     }
  617.     else {
  618.         if (!keepHilite) {
  619.             this.bgColor = this.container.menuBGColor;
  620.             if (NSfontOver) {
  621.                 with (this.txtLyr.document) {
  622.                     write(this.htmStr);
  623.                     close();
  624.                 }
  625.             }
  626.     
  627.         }
  628.         if (!isOverMenu && !clickKill) {
  629.             allTimer = setTimeout("currentMenu.hideTree()",10); 
  630.         }
  631.     }
  632. }
  633.  
  634. function moveTo(xPos,yPos) {
  635.     this.style.pixelLeft = xPos;
  636.     this.style.pixelTop = yPos;
  637. }
  638.  
  639. function showIt(on) {
  640.     if (NS4) {
  641.         this.visibility = (on) ? "show" : "hide";
  642.         if (keepHilite && this.currentItem) {
  643.             this.currentItem.bgColor = this.menuBGColor;
  644.             if (NSfontOver) {
  645.                 with (this.currentItem.txtLyr.document) {
  646.                     write(this.currentItem.htmStr);
  647.                     close();
  648.                 }
  649.             }
  650.         }
  651.     }
  652.     else {
  653.         this.style.visibility = (on) ? "visible" : "hidden";
  654.         if (keepHilite && this.currentItem) {
  655.             with (this.currentItem.style) {
  656.                 backgroundColor = this.menuBGColor;
  657.                 color = this.menuFontColor;
  658.             }
  659.         }
  660.     }
  661.     this.currentItem = null;
  662. }
  663.  
  664. function keepInWindow() {
  665.     scrBars = 20;
  666.     botScrBar = (isFrames && navFrLoc=="bottom") ? (borWid*2) : scrBars;
  667.     rtScrBar = (isFrames && navFrLoc=="right") ? (borWid*2) : scrBars;
  668.     if (NS4) {
  669.         winRight = (menuLoc.pageXOffset + menuLoc.innerWidth) - rtScrBar;
  670.         rightPos = this.left + this.menuWidth;
  671.    
  672.         if (rightPos > winRight) {
  673.             if (this.hasParent) {
  674.                 parentLeft = this.parentMenu.left;
  675.                 newLeft = ((parentLeft-this.menuWidth) + this.childOverlap);
  676.                 this.left = newLeft;
  677.             }
  678.             else {
  679.                 dif = rightPos - winRight;
  680.                 this.left -= dif;
  681.             }
  682.         }
  683.  
  684.         winBot = (menuLoc.pageYOffset + menuLoc.innerHeight) - botScrBar ;
  685.         botPos = this.top + this.fullHeight;
  686.  
  687.         if (botPos > winBot) {
  688.             dif = botPos - winBot;
  689.             this.top -= dif;
  690.         }
  691.         
  692.         winLeft = menuLoc.pageXOffset;
  693.         leftPos = this.left;
  694.  
  695.         if (leftPos < winLeft) {
  696.             if (this.hasParent) {
  697.                 parentLeft = this.parentMenu.left;
  698.                 newLeft = ((parentLeft+this.menuWidth) - this.childOverlap);
  699.                 this.left = newLeft;
  700.             }
  701.             else {
  702.                 this.left = 5;
  703.             }
  704.         }
  705.     }
  706.     else {
  707.         winRight = (menuLoc.document.body.scrollLeft + menuLoc.document.body.clientWidth) - rtScrBar;
  708.         rightPos = this.style.pixelLeft + this.menuWidth;
  709.     
  710.         if (rightPos > winRight) {
  711.             if (this.hasParent) {
  712.                 parentLeft = this.parentMenu.style.pixelLeft;
  713.                 newLeft = ((parentLeft - this.menuWidth) + this.childOverlap);
  714.                 this.style.pixelLeft = newLeft;
  715.             }
  716.             else {
  717.                 dif = rightPos - winRight;
  718.                 this.style.pixelLeft -= dif;
  719.             }
  720.         }
  721.  
  722.         winBot = (menuLoc.document.body.scrollTop + menuLoc.document.body.clientHeight) - botScrBar;
  723.         botPos = this.style.pixelTop + this.fullHeight;
  724.  
  725.         if (botPos > winBot) {
  726.             dif = botPos - winBot;
  727.             this.style.pixelTop -= dif;
  728.         }
  729.         
  730.         winLeft = menuLoc.document.body.scrollLeft;
  731.         leftPos = this.style.pixelLeft;
  732.  
  733.         if (leftPos < winLeft) {
  734.             if (this.hasParent) {
  735.                 parentLeft = this.parentMenu.style.pixelLeft;
  736.                 newLeft = ((parentLeft+this.menuWidth) - this.childOverlap);
  737.                 this.style.pixelLeft = newLeft;
  738.             }
  739.             else {
  740.                 this.style.pixelLeft = 5;
  741.             }
  742.         }
  743.     }
  744. }
  745.  
  746. function linkIt() {
  747.     if (this.linkText.indexOf("javascript:")!=-1) eval(this.linkText)
  748.     else menuLoc.location.href = this.linkText;
  749. }
  750.  
  751. function popDown(menuName){
  752.     if (!isLoaded || !areCreated) return;
  753.     whichEl = eval(menuName);
  754.     whichEl.isOn = false;
  755.     if (!clickKill) whichEl.hideTop();
  756. }
  757.  
  758. function hideAll() {
  759.     for(i=1; i<topCount; i++) {
  760.         temp = eval("elMenu" + i + ".startChild");
  761.         temp.isOn = false;
  762.         if (temp.hasChildVisible) temp.hideChildren();
  763.         temp.showIt(false);
  764.     }    
  765. }
  766.  
  767. function hideTree() { 
  768.     allTimer = null;
  769.     if (isOverMenu) return;
  770.     if (this.hasChildVisible) {
  771.         this.hideChildren();
  772.     }
  773.     this.hideParents();
  774. }
  775.  
  776. function hideTop() {
  777.     whichTop = this;
  778.     (clickKill) ? whichTop.hideSelf() : (this.hideTimer = setTimeout("if(whichTop.hideSelf)whichTop.hideSelf()",mSecsVis));
  779. }
  780.  
  781. function hideSelf() {
  782.     this.hideTimer = null;
  783.     if (!this.isOn && !isOverMenu) { 
  784.         this.showIt(false);
  785.     }
  786. }
  787.  
  788. function hideParents() {
  789.     tempMenu = this;
  790.     while (tempMenu.hasParent) {
  791.         tempMenu.showIt(false);
  792.         tempMenu.parentMenu.isOn = false;        
  793.         tempMenu = tempMenu.parentMenu;
  794.     }
  795.     tempMenu.hideTop();
  796. }
  797.  
  798. function hideChildren(item) {
  799.     tempMenu = this.visibleChild;
  800.     while (tempMenu.hasChildVisible) {
  801.         tempMenu.visibleChild.showIt(false);
  802.         tempMenu.hasChildVisible = false;
  803.         tempMenu = tempMenu.visibleChild;
  804.     }
  805.  
  806.     if (!this.isOn || !item.hasMore || this.visibleChild != this.child) {
  807.         this.visibleChild.showIt(false);
  808.         this.hasChildVisible = false;
  809.     }
  810. }
  811.  
  812. function cancelSelect(){return false}
  813.  
  814. function reDo(){
  815.     if (loader.innerWidth==origWidth && loader.innerHeight==origHeight) return;
  816.     initVars();
  817.     NSresized=true;
  818.     menuLoc.location.reload();
  819. }
  820.  
  821. function clicked() {
  822.     if (!isOverMenu && currentMenu!=null && !currentMenu.isOn) {
  823.         whichEl = currentMenu;
  824.         whichEl.hideTree();
  825.     }
  826. }
  827.  
  828. window.onerror = handleErr;
  829.  
  830. function handleErr(){
  831.     arAccessErrors = ["permission","access"];
  832.     mess = arguments[0].toLowerCase();
  833.     found = false;
  834.     for (i=0;i<arAccessErrors.length;i++) {
  835.         errStr = arAccessErrors[i];
  836.         if (mess.indexOf(errStr)!=-1) found = true;
  837.     }
  838.     return found;
  839. }
  840.  
  841. //end